1819
18813
在comp.lang.c ++。moderated上閱讀了C ++ / STL的“隱藏功能”和“黑暗角落”之後,我完全驚訝於以下代碼段在Visual Studio 2008和G ++ 4.4中都可以編譯並正常工作。
這是代碼:
#include 
int main()
{
整數x = 10;
while(x-> 0)// x變為0
{
printf(“%d”,x);
}
}
輸出:
9 8 7 6 5 4 3 2 1 0
我認為這是C,因為它也可以在GCC中使用。該標准在哪裡定義,以及它來自何處? 
->不是運算符。實際上,它是兩個單獨的運算符,-和>。
條件代碼將x遞減,同時返回x的原始(未遞減)值,然後使用>運算符將原始值與0比較。
為了更好地理解,該語句可以編寫如下:
while((x--)> 0)
|
或者對於完全不同的東西... x滑到0。
而(x-\
\
\
\
> 0)
printf(“%d”,x);
並不是那麼數學,但是...每張畫都畫一千個字...
|
這是一個非常複雜的運算符,因此即使是ISO / IEC JTC1(聯合技術委員會1)也將其說明放在C ++標準的兩個不同部分中。
除了開玩笑,它們是兩個不同的運算符:-和>分別在C ++ 03標準的5.2.6 / 2和5.9節中進行了描述。
|
相當於
而(x--> 0)
x--(後減量)等效於x = x-1,因此代碼轉換為:
while(x> 0){
x = x-1;
//邏輯
}
X - ; //當x <= 0時完成後遞減
|
x可以在相反的方向更快地變為零:
整數x = 10;
而(0 <---- x)
{
printf(“%d”,x);
}
8 6 4 2
您可以用箭頭控制速度!
整數x = 100;
while(0 <-------------------- x)
{
printf(“%d”,x);
}
90 80 70 60 50 40 30 20 10
;)
|
它的
#include 
int main(void){
整數x = 10;
while(x--> 0){// x變為0
printf(“%d”,x);
}
返回0;
}
只是空間使事情看起來很有趣,即遞減並進行比較。
|
->的用法具有歷史意義。減少(在某些情況下仍然是)比在x86架構上增加要快。使用->表示x即將變為0,並吸引那些具有數學背景的人。
|
而(x--> 0)
是這樣解析的。
|
極客,但我會用這個:
#定義為; while
int main(int argc,char * argv [])
{
int n = atoi(argv [1]);
將printf(“ n為%d \ n”,n)做為(n-> 0);
返回0;
}
|
我讀過的一本書(我不記得是哪本書)說:編譯器嘗試使用左右規則將表達式解析為最大標記。
在這種情況下,表達式為:
x-> 0
解析為最大令牌:
令牌1:x
令牌2:-
令牌3:>
令牌4:0
結論:x--> 0
相同的規則適用於此表達式:
a ----- b
解析後:
令牌1:
令牌2:-
令牌3:-
令牌4:-
令牌5:b
結論:(a-)--b
我希望這有助於理解複雜的表達方式^^
|
這與
而(x--)
{
printf(“%d”,x);
}
對於非負數
|
無論如何,我們現在有一個“轉到”運算符。容易記住“->”作為方向,而“ x趨於零時”則很簡單。
此外,它在某些平台上比“ for(x = 10; x> 0; x-)”有效。
|
此代碼首先將x與0比較,然後將x減1。 (也請在第一個答案中說:先遞減x,然後將x和0與>運算符進行比較。)請參見以下代碼的輸出:
9 8 7 6 5 4 3 2 1 0
現在,我們首先進行比較,然後通過在輸出中看到0來遞減。
如果我們要先遞減然後比較,請使用以下代碼:
#include 
int main(無效)
{
整數x = 10;
while(--x> 0)// x變為0
{
printf(“%d”,x);
}
返回0;
}
該輸出是:
9 8 7 6 5 4 3 2 1
|
運行此代碼時,我的編譯器將打印出9876543210。
#include 
int main()
{
整數x = 10;
while(x-> 0)// x變為0
{
std :: cout << x;
}
}
如預期的那樣。 while(x--> 0)實際上意味著while(x> 0)。 x--後減x。
而(x> 0)
{
X - ;
std :: cout << x;
}
是寫同一件事的另一種方式。
很好的是,原來看起來像“而x變為0”。
|
-和>之間缺少空格。 x是遞減的,也就是說,在檢查條件x> 0?之後遞減。
|
-是減量運算符,而>是大於運算符。
這兩個運算符像->一樣應用為單個運算符。
|
它是兩個運算符的組合。首先-用於減小值,而>用於檢查該值是否大於右側操作數。
#include 
int main()
{
整數x = 10;
而(x--> 0)
printf(“%d”,x);
返回0;
}
輸出將是:
9 8 7 6 5 4 3 2 1 0
|
實際上,x是遞減的,並且正在檢查該條件。不是->(x--)> 0
注意:檢查條件後,x的值會更改,因為它會遞減。也會發生一些類似的情況,例如:
-> x-> 0
++> x ++> 0
-> = x-> = 0
++> = x ++> = 0
|
C和C ++遵守“最大嚼數”規則。將a --- b轉換為(a--)-b的方法相同,在您的情況下,x-> 0轉換為(x-)> 0。
規則本質上是說,從左到右,表達式是通過採用將構成有效表達式的最大字符組成的。
|
為什麼所有的並發症?
原始問題的簡單答案是:
#include 
int main()
{
整數x = 10;
而(x>0)
{
printf(“%d”,x);
x = x-1;
}
}
它做同樣的事情。我並不是說您應該這樣做,但是它做同樣的事情,並且會在一篇文章中回答這個問題。
x--只是上述的簡寫,而>只是普通的大於運算符。沒什麼大不了的!
如今有太多人使簡單的事情變得複雜;)
|
以常規方式,我們將在while循環括號()中定義一個條件,並在括號{}中定義一個終止條件,但是->會同時定義這兩個條件。
例如:
int abc(無效)
{
整數a = 5
while(((a--)> 0)//同時減少和比較
{
//代碼
}
}
這會減小a並在a大於0時運行循環。
按照慣例,它將是:
int abc(無效)
{
整數= 5;
而(a> 0)
{
一種 - ;
//代碼
}
一種 - ;
}
兩種方式,我們都做相同的事情,實現相同的目標。
|
(x-> 0)表示(x--> 0)。
您可以使用(x->)輸出:9 8 7 6 5 4 3 2 1 0
您可以使用(-x> 0)表示(--x> 0)輸出:9 8 7 6 5 4 3 2 1
您可以使用
(-
\
x> 0)
輸出:9 8 7 6 5 4 3 2 1
您可以使用
(\
\
x-> 0)
輸出:9 8 7 6 5 4 3 2 1 0
您可以使用
(\
\
x-> 0
\
\
)
輸出:9 8 7 6 5 4 3 2 1 0
您也可以使用
(
X
->
)
輸出:9 8 7 6 5 4 3 2 1 0
同樣,您可以嘗試許多方法來成功執行此命令。
|
這是一元後遞減運算符。
while(x--> 0)// x變為0
{
printf(“%d”,x);
}
在開始時,條件將評估為
(x> 0)// 10> 0
現在因為條件為真,它將以遞減的值進入循環
x-- // x = 9
這就是為什麼第一個打印值為9
等等。在最後一個循環中x = 1,因此條件為true。按照一元運算符,在打印時該值變為x = 0。
現在,x = 0,它將條件(x> 0)評估為false,而while循環退出。
|
->根本不是運算符。我們有一個類似於->的運算符,但不像->那樣。這只是對while(x--> 0)的錯誤解釋,這僅意味著x具有後減量運算符,並且此循環將一直運行到大於零為止。
編寫此代碼的另一種簡單方法是while(x--)。 while循環將在出現錯誤條件時停止,並且這裡只有一種情況,即0。因此,當x值減小到零時,它將停止。
|
高度活躍的問題。贏得10個聲譽才能回答這個問題。信譽要求有助於保護該問題免受垃圾郵件和非答復活動的侵害。
不是您要找的答案?瀏覽標記為c ++ c運算符的其他問題,其代碼格式符合標準,或者提出您自己的問題。